//package websocket.service.impl;
//
//import com.alibaba.fastjson.JSONObject;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.stereotype.Service;
//import websocket.entity.HangXiangDO;
//import websocket.enum_.MsgType;
//import websocket.enum_.PosTypeEnum;
//import websocket.enum_.SolStatEnum;
//import websocket.service.ChuanKouService;
//import websocket.socket_.SocketMsg;
//import websocket.socket_.WebSocketServer;
//import websocket.util.DateUtil;
//import websocket.util.DigitalTrans;
//
//import java.io.IOException;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//
///**
// * @author nieruijie
// * @date 2022/5/22 14:17
// */
//@Service
//public class ChuanKouServiceImpl implements ChuanKouService {
//
//    @Override
//    public void chuLiChuanKouData(String needData) {
//        if (StringUtils.isEmpty(needData)) {
//            System.err.println("接收到串口数据为空！时间：" + DateUtil.formatNow());
//            return;
//        }
//        needData = needData.replaceAll("AA 44 12", "NJ");
//        String reg16 = "NJ[^NJ]*NJ";
//        //利用正则表达式定义规则，NJ开头中间除了NJ任意都获取，NJ结尾
//        Pattern p = Pattern.compile(reg16);
//        Matcher m = p.matcher(needData);
//        List<String> contentList = new ArrayList<>();
//        while (m.find()) {
//            String content = m.group().substring(0, m.group().length() - 3);
//            contentList.add(content.replace("NJ", "AA 44 12"));
//        }
//        contentList.forEach(item -> {
//            this.chuLiArr(item);
//        });
//    }
//
//    private void chuLiArr(String item) {
//        HangXiangDO resultData = new HangXiangDO();
//        // 下标
//        int index = 0;
//        // 将当前十六进制数据用空格分隔成数组
//        String[] sixteenArr = item.split(" ");
//        // 获取当前数组长度：作为后期数据转换使用
//        int arrLength = sixteenArr.length;
//        // 从第四位开始：头长度 0x1C   HeaderLength 字节数 = 1
//        String fourItem = sixteenArr[3];
//        // 从第五位开始：MessageID Log 的信息 ID 字节数 = 2 （字节数等于2，所以截取第五六位,这里低字节在前高字节在后，所以反着拼接）
//        String sixToFiveItem = sixteenArr[5] + sixteenArr[4];
//        // 从第七位开始：Message Type：00 =二进制,01 = ASCII,10 = 简化 ASCII (本次使用00也就是二进制)
//        String sevenItem = sixteenArr[6];
//        // 判断是否为二进制
//        if (!sevenItem.equals("00")) {
//            return;
//        }
//        // 从第八位开始：Reserved 保留 （保留字段，不管）
//        String eightItem = sixteenArr[7];
//        // 从第九位开始：Reserved 保留 （保留字段，不管）
//        String nineItem = sixteenArr[8];
//
//        int fourItemToInt = Integer.parseInt(DigitalTrans.covert16Zhuan10(fourItem));
//        index += fourItemToInt;
//
//        // 类型判断：messageID；那个数据
//        // sixToFiveItem
//        // 解析：是否等于航向    MessageID ：971
//        Integer sixToFiveItemToInt = Integer.parseInt(DigitalTrans.covert16Zhuan10(sixToFiveItem));
//        if (sixToFiveItemToInt == 971) {
//            System.err.println("头长度:" + fourItem + "<->" + DigitalTrans.covert16Zhuan10(fourItem));
//            System.err.println("MessageID Log:" + sixToFiveItem + "<->" + DigitalTrans.covert16Zhuan10(sixToFiveItem));
//            System.err.println("Message Type:" + sevenItem + "<->" + DigitalTrans.covert16Zhuan10(sevenItem));
//            System.err.println(eightItem);
//            System.err.println(nineItem);
//
//
//            /*
//            0 SOL_COMPUTED 已解出
//            1 INSUFFICIENT_OBS 观测数据不足
//            2 NO_CONVERGENCE 无法收敛
//            4 COV_TRACE 协方差矩阵的迹超过最大值（迹>1000 米）*/
//            // 解状态 (字节数 = 4，从头长度之后开始取值，四个字节)
//            index += 4;
//            String solStat = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4];
//            int solStatInt = Integer.parseInt(DigitalTrans.covert16Zhuan10(solStat));
//            // 位置类型 （字节数 = 4）
//            index += 4;
//            String posType = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4];
//            int posTypeInt = Integer.parseInt(DigitalTrans.covert16Zhuan10(posType));
//            System.err.println("解状态：" + solStat);
//            System.err.println("解状态val：" + SolStatEnum.getMsgByIndex(solStatInt));
//            System.err.println("位置类型：" + posType);
//            System.err.println("位置类型val：" + PosTypeEnum.getMsgByIndex(posTypeInt));
//
//            resultData.setPosType(PosTypeEnum.getMsgByIndex(posTypeInt));
//            // 基线长（0-3000m）
//            index += 4;
//            String length = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4];
//            Double lengthDouble = Double.valueOf(DigitalTrans.covert16Zhuan10(length));
//            System.err.println("基线长：" + length);
//            System.err.println("基线长val：" + lengthDouble);
//
//            resultData.setLength(lengthDouble);
//            // 航向（0到360.0 deg）
//            index += 4;
//            String heading = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4];
//            Double headingDouble = Double.parseDouble(DigitalTrans.covert16Zhuan10(heading));
//            System.err.println("航向：" + heading);
//            System.err.println("航向val：" + headingDouble);
//            resultData.setHeading(headingDouble);
//            // 仰俯（±90 deg）
//            index += 4;
//            String pitch = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4];
//            Double pitchLong = Double.parseDouble(DigitalTrans.covert16Zhuan10(pitch));
//            System.err.println("仰俯：" + pitch);
//            System.err.println("仰俯val：" + pitchLong);
//            resultData.setPitch(pitchLong);
//            // 使用的卫星数
//            index += 18;
//            String solnSVs = sixteenArr[index];
//            Long solnSVsInt = Long.valueOf(DigitalTrans.covert16Zhuan10(solnSVs));
//            System.err.println("使用的卫星数：" + solnSVs);
//            System.err.println("使用的卫星数val：" + solnSVsInt);
//            resultData.setSolnSVs(solnSVsInt);
//            try {
//                SocketMsg socketMsg = new SocketMsg(JSONObject.toJSONString(resultData), MsgType.HANG_XIANG);
//                WebSocketServer.sendInfo(socketMsg, "nrj");
//                System.err.println("WRJ消息发送成功,[航向信息]时间:" + DateUtil.formatNow());
//            } catch (IOException e) {
//                System.err.println("WRJ消息发送失败,[航向信息]时间:" + DateUtil.formatNow());
//                e.printStackTrace();
//            }
//            System.err.println("<----------------------------------->");
//        }
//        // 解析：是否等于最佳位置  MessageID ：42
//        if (sixToFiveItemToInt == 42) {
//            // 维度（字节数 = 8）
//            index += 16;
//            String lat = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4] + sixteenArr[index - 5] + sixteenArr[index - 6] + sixteenArr[index - 7] + sixteenArr[index - 8];
//            Double latDouble = Double.parseDouble(DigitalTrans.covert16Zhuan10(lat));
//            resultData.setLat(latDouble);
//            // 经度 （字节数 = 8）
//            index += 8;
//            String lon = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4] + sixteenArr[index - 5] + sixteenArr[index - 6] + sixteenArr[index - 7] + sixteenArr[index - 8];
//            Double lonDouble = Double.parseDouble(DigitalTrans.covert16Zhuan10(lon));
//            resultData.setLon(lonDouble);
//            // 海拔高 （字节数 = 8）
//            index += 8;
//            String hgt = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4] + sixteenArr[index - 5] + sixteenArr[index - 6] + sixteenArr[index - 7] + sixteenArr[index - 8];
//            Double hgtDouble = Double.parseDouble(DigitalTrans.covert16Zhuan10(hgt));
//            resultData.setHgt(hgtDouble);
//            index += 28;
//            // 差分龄期 （字节数 = 4）
//            String diff_age = sixteenArr[index - 1] + sixteenArr[index - 2] + sixteenArr[index - 3] + sixteenArr[index - 4];
//            Double diff_ageDouble = Double.parseDouble(DigitalTrans.covert16Zhuan10(diff_age));
//            resultData.setDiffAge(diff_ageDouble);
//
//            try {
//                SocketMsg socketMsg = new SocketMsg(JSONObject.toJSONString(resultData), MsgType.HANG_XIANG);
//                WebSocketServer.sendInfo(socketMsg, "nrj");
//                System.err.println("WRJ消息发送成功,[最佳位置信息]时间:" + DateUtil.formatNow());
//            } catch (IOException e) {
//                System.err.println("WRJ消息发送失败,[最佳位置信息]时间:" + DateUtil.formatNow());
//                e.printStackTrace();
//            }
//        }
//    }
//}
